﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using DataAccessLayer;
using System.Configuration;
using System.Data;

namespace DAL
{
    public class TaoMaSoTuDongDAL
    {
        #region Khai báo
        private DBManager _dbmanager;
        private int chieudai, index;
        private string tiento;
        #endregion

        #region Khởi tạo
        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public TaoMaSoTuDongDAL()
        {
            string _connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            _dbmanager = new DBManager(DataProvider.SqlServer, _connectionInfo);
        }

        #endregion

        #region Định nghĩa
        /// <summary>
        /// Phương thức kiểm tra 1 ký tự có phải là số ko?
        /// </summary>
        /// <param name="kytu"></param>
        /// <returns></returns>
        public bool IsNumber(Char kytu)
        {
            if (!Char.IsDigit(kytu))
                return false;         
            return true;
        }

        /// <summary>
        /// Phương thức đếm số lượng ký tự trong một chuỗi
        /// </summary>
        /// <param name="Chuoi"></param>
        /// <returns></returns>
        private int demChuoi(string Chuoi)
        {
            int dem = 0;
            for (int i = 0; i < Chuoi.Length; i++)
            {
                if (!this.IsNumber(Chuoi[i]))
                    dem++;                     
            }
            return dem;
        }

        /// <summary>
        /// Phương thức getTableName
        /// </summary>
        /// <param name="tablename"></param>
        /// <returns>string</returns>
        private string getTableName(string tablename)
        {
            string str = "";            
            foreach (Char c in tablename)
            {
                int chuoi = Convert.ToInt32(c);
                if (chuoi >= 65 && chuoi <= 90) /* c là ký tự Hoa*/
                {
                    str += c.ToString();
                }
                    
            }
            return str;
        }

        /// <summary>
        /// Phương thức tạo mã số tự động
        /// </summary>
        /// <param name="TableName">Tên của table trong CSDL</param>
        /// <returns>string</returns>
        public string TaoMaTuDong(string TableName) 
        {
            string TableField = "Ma"+TableName;
            string table_name, congdon;
            try
            {
                _dbmanager.Open();

                DataTable dt = new DataTable();

                dt = _dbmanager.ExecuteDataSet(CommandType.Text, "select " + TableField + " from " + TableName).Tables[0];
                _dbmanager.Close();

                List<int> lst = new List<int>();
                // Duyệt qua từng dòng của table
                foreach (DataRow rw in dt.Rows)
                {
                    string rowdata = rw[TableField].ToString();
                    chieudai = this.demChuoi(rowdata);
                    int num = Convert.ToInt32(rowdata.Substring(chieudai)); // Tách chuỗi để lấy chiều dài, kết quả trả về là chuỗi số

                    // Add vào List
                    lst.Add(num);
                }

                // Sắp xếp List và xác định chuỗi số thứ i
                SapTang(lst);

                int k = 1;
                while (k <= lst.Count)
                {
                    if (k != lst[k - 1])
                        break;
                    k++;
                }

                // Kiểm tra vượt quá giới hạn chuỗi số (10 số) hay chưa?
                index = 0;
                if (k.Equals(9999999999)) //9,999,999,999
                    // Tăng tiền tố lên                       
                    index += 1;
                // Giữ nguyên
                tiento = Convert.ToChar(index + 65) + "-";

                // Lấy các ký tự in Hoa của TableName
                table_name = this.getTableName(TableName);

                // Tìm được số thứ tự của mã số ta cộng dồn vào
                // Mã số = Tiền tố + "-" + Chuỗi số thứ tự                  

                // Cộng dồn số thứ tự k vào
                congdon = FitAdd(k);

                // Đảm bảo k thuộc (00,000,000 - 99,999,999)
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return (tiento + table_name + congdon); 
        }

        private static string FitAdd(int number)
        {
            string str = "";
            int dem = Count(number);
            int n = 10 - dem;
            for (int i = 0; i < n; i++)
            {
                str += "0";
            }
            return str + number;
        }

        
        private static int Count(int number)
        {
            int dem = 1;
            while (number >= 10)
            {
                dem++;
                number = number / 10;
            }
            return dem;
        }

        private static void SapTang(List<int> lst)
        {
            for (int i = 0; i <= lst.Count - 2; i++)
                for (int j = i + 1; j <= lst.Count - 1; j++)
                {
                    if (lst[i] > lst[j])
                    {
                        int temp = lst[i];
                        lst[i] = lst[j];
                        lst[j] = temp;
                    }
                }
        }
        #endregion
    }
}